import axios from 'axios';
import ElementUI from 'element-ui';
import router from '../router';

// 创建axios实例
const http = axios.create({
  // 基础URL
  // 在开发环境中使用相对路径，这样请求会被webpack代理处理，避免跨域问题
  baseURL: '/',
  // 请求超时时间
  timeout: 10000,
  // 请求头配置
  headers: {
    'Content-Type': 'application/json;charset=utf-8',
    'Accept': 'application/json;charset=utf-8'
  }
});

// 请求拦截器
http.interceptors.request.use(
  config => {
    // 添加请求前的处理，如加载动画
    ElementUI.Loading.service({ text: '加载中...' });
    
    // 可以在这里添加token等认证信息
    const token = localStorage.getItem('token');
    if (token) {
      config.headers['Authorization'] = `Bearer ${token}`;
    }
    
    // 确保请求数据的编码正确
    if ((config.method === 'post' || config.method === 'put') && config.data && typeof config.data !== 'string') {
      config.data = JSON.stringify(config.data);
    }
    
    return config;
  },
  error => {
    // 请求错误处理
    ElementUI.Loading.service().close();
    ElementUI.Message.error('请求配置错误');
    return Promise.reject(error);
  }
);

// 响应拦截器
http.interceptors.response.use(
  response => {
    // 关闭加载动画
    ElementUI.Loading.service().close();
    
    // 确保响应数据中的中文正确解码
    if (response && response.data) {
      // 检查是否是字符串，如果是，尝试解析为JSON
      if (typeof response.data === 'string') {
        try {
          response.data = JSON.parse(response.data);
        } catch (e) {
          // 如果不是有效的JSON字符串，保持原样
        }
      }
    }
    
    // 统一处理响应格式，后端可能返回两种格式：
    // 1. ApiResponse对象，包含code、message、data字段
    // 2. 包含success、data、message等字段的自定义响应对象
    if (response.data && typeof response.data === 'object') {
      // 第一种格式：ApiResponse对象
      if ('code' in response.data) {
        // 根据code字段判断请求是否成功
        if (response.data.code === 200) {
          // 请求成功，直接返回数据部分
          return response.data;
        } else {
          // 请求失败，显示错误信息
          ElementUI.Message.error(response.data.message || '请求失败');
          return Promise.reject(response.data);
        }
      }
      // 第二种格式：包含success字段的自定义响应对象
      else if ('success' in response.data) {
        if (response.data.success) {
          // 请求成功，直接返回数据部分
          return response.data;
        } else {
          // 请求失败，显示错误信息
          ElementUI.Message.error(response.data.message || '请求失败');
          return Promise.reject(response.data);
        }
      }
    }
    
    return response;
  },
  error => {
    // 关闭加载动画
    ElementUI.Loading.service().close();
    
    // 统一错误处理
    if (error.response) {
      // 确保错误消息中的中文正确显示
      // 检查错误响应是否是ApiResponse格式
      let errorMessage = '请求失败';
      if (error.response && error.response.data) {
        if (typeof error.response.data === 'string') {
          try {
            // 尝试解析JSON字符串
            const errorData = JSON.parse(error.response.data);
            errorMessage = errorData.message || error.message || errorMessage;
          } catch (e) {
            // 如果解析失败，使用原始字符串或默认消息
            errorMessage = error.response.data || error.message || errorMessage;
          }
        } else if (error.response.data.message) {
          errorMessage = error.response.data.message;
        } else {
          errorMessage = error.message || errorMessage;
        }
      }
          
      switch (error.response.status) {
        case 401:
          // 未授权，跳转到登录页
          ElementUI.Message.error('未授权，请重新登录');
          localStorage.removeItem('token');
          router.push('/login');
          break;
        case 403:
          // 权限不足
          ElementUI.Message.error('权限不足，无法访问该资源');
          break;
        case 404:
          // 资源不存在
          ElementUI.Message.error(errorMessage || '请求的资源不存在');
          break;
        case 429:
          // 请求过于频繁
          ElementUI.Message.error('请求过于频繁，请稍后再试');
          break;
        case 500:
          // 服务器内部错误
          ElementUI.Message.error('服务器内部错误');
          break;
        default:
          // 其他错误
          ElementUI.Message.error(errorMessage);
      }
    } else if (error.request) {
      // 请求发出但没有收到响应
      ElementUI.Message.error('网络错误或服务器未响应');
    } else {
      // 请求配置错误
      ElementUI.Message.error('请求配置错误');
    }
    
    return Promise.reject(error);
  }
);

/**
 * GET请求
 * @param {string} url - 请求URL
 * @param {object} params - 请求参数
 * @param {object} config - 额外配置
 * @returns {Promise}
 */
export const get = (url, params = {}, config = {}) => {
  return http.get(url, { params, ...config });
};

/**
 * POST请求
 * @param {string} url - 请求URL
 * @param {object} data - 请求数据
 * @param {object} config - 额外配置
 * @returns {Promise}
 */
export const post = (url, data = {}, config = {}) => {
  return http.post(url, data, config);
};

/**
 * PUT请求
 * @param {string} url - 请求URL
 * @param {object} data - 请求数据
 * @param {object} config - 额外配置
 * @returns {Promise}
 */
export const put = (url, data = {}, config = {}) => {
  return http.put(url, data, config);
};

/**
 * DELETE请求
 * @param {string} url - 请求URL
 * @param {object} params - 请求参数
 * @param {object} config - 额外配置
 * @returns {Promise}
 */
export const del = (url, params = {}, config = {}) => {
  return http.delete(url, { params, ...config });
};

/**
 * 上传文件
 * @param {string} url - 请求URL
 * @param {FormData} formData - 包含文件的FormData对象
 * @param {function} onUploadProgress - 上传进度回调函数
 * @returns {Promise}
 */
export const upload = (url, formData, onUploadProgress) => {
  return http.post(url, formData, {
    headers: {
      'Content-Type': 'multipart/form-data'
    },
    onUploadProgress
  });
};

// 导出默认实例和方法
export default {
  ...http,
  get,
  post,
  put,
  delete: del,
  upload
};